一、虚函数表
	什么是虚函数表，在C++类中，一旦成员函数中有虚函数，这个类中就会多一个虚函数表指针，这个指针指向一系列虚函数表，表里面记录了这个类中所有的虚函数，当这个类被继承，它的子类中也会有一个虚函数表，如果子类的成员函数中有函数签名与父类的虚函数一样，就会用子类中的函数替换它在虚函数表中的位置，这样就达到了覆盖的效果。
	
	当通过类指针或引用调用函数时，会根据对象中实际的虚函数表记录来调用函数，这样就达到了多态的效果



二、虚析构
	当使用delete释放一个父类指针时，不管实际指向的对象是子类还是父类都只会调用父类的析构函数(多态肯定会出现的问题)。
	
	如果子类的析构函数有需要释放的内存，就会造成内存泄露。

	为了解决这个问题，可以把父类的析构函数设置为虚函数，析构函数进行覆盖时不会比较函数名

	当父类的析构函数为虚函数时，通过父类指针或引用释放子类对象时，会自动调用子类的析构函数(子类对象的析构函数执行完成后也会自动调用父类的析构函数)

	注意：析构函数可以是虚函数，但构造函数不行


三、强制类型转换
	注意：C++为了兼容C语言，(目标类型)原类型依然可以使用，
但C语言中的强制类型转换安全性差，因此建议使用C++中的强制类型转换。

	注意：C++之父认为如果代码设计的完善，根本不需要用到强制类型转换，C++中的强制类型转换之所以设计的很复杂，是为了让程序员多关注代码本身的设计，尽量少使用。

	C++中的强制类型转换保证没有很大的安全隐患
	
	static_cast<目标类型>（原类型）		编译器会对源类型和目标类型做兼容性检查，不通过则报错。 
	dynamic_cast						编译器会对源类型和目标类型是否同为指针或引用，并且存在多态型的继承关系
	const_cast							编译器会对源类型和目标类型是否同为指针或引用，除了常属性外其他必须完全相同，否则报错
	reinterpret_cast					编译器会对源类型和目标类型是否为指针或整数进行检查，也就是说把整数转换成指针，或把指针转换成整数
	
	
	
	动态编译，静态编译

	静态编译：指针或引用的目标是确定的，在编译时间就经过所有类型检查及函数调用。
	
	动态编译：指针或引用的目标不确定（多态），只有在函数调用的时候，才确定具体是哪个成员(子类)




四、I/O 流
	I/O 流的打开模式：
	
	ios::in
	
	app		打开文件用于追加，不存在则创建，存在不清空
	ate		打开时定位到文件末尾
	binary	以二进制模式进行读写
	in		以读权限打开文件，不存在则失败，存在不清空
	out		以写权限打开文件，不存在则创建，存在则清空
	trunc	打开文件后清空

-------------------------------------------------------------
fstream fs("test.txt",ios::out);//构造函数以写权限打开

fstream fs;//成员函数以写权限打开
fs.open("test.txt",ios::out);

//写入
fs<<"hehe"<<endl;
-------------------------------------------------------------



fstream/ifstream/ofstream 类用于执行文件操作
	构造函数 或 成员函数 open 用于打开文件
	good成员函数检查流是否可用
	eof成员函数用于判断输入流是否结束
	
	
	>>操作符用于从文件中读取字符到变量
	<<操作符用于从文件中输出数据到文件
	
	IO流有一系列格式化控制函数，类似：左对齐，右对齐，宽度，填充，小数点位数。
	
	
	
	二进制的读写read/write
		read(char_type *__s,streamsize__n)
		gcount成员函数可以获取上次流的二进制读操作的字节数


		write(char_type *__s,streamsize__n)
		gcount成员函数可以获取写操作是否成功

	随机读写 seekp(off_type,ios_base::seekdir)
		功能：设置文件的位置指针
		off_type:基础位置
		seekdir:偏移值
					
				ios::beg	开头
				ios::cur	当前位置
				ios::end	文件末尾	





五、类型信息 typeof
	用于获取数据的类型信息
	name成员函数，可以获取类型的名字，内建类型名字使用缩写。
	同时还支持== !=用来比较是否是同一类型

	如果用于判断父子类的指针或引用，它不能准确判断出实际对象的类型，但可以判断出具有多态继承的关系的父子类的指针或引用，它的实际类型的对象



	sudo find / -name filename 

	
	sudo find / | grep "xxx"
	
	grep 'xxx'* 当前目录查找文件中包含的字符



六、异常处理
	抛异常
		throw 数据
		
		抛异常对象
		
		抛基本类型
		注意：不能抛出局部对象的指针或引用
		注意：如果异常没有被捕获处理，程序就会停止。
	捕获异常
		try{
			可能抛出异常的代码
		}
		catch(类型 变量名)//根据数据类型进行捕获
		{
			处理异常，如果无法处理可以继续抛出异常
		}

	注意：捕获异常的顺序是自上而下的，而不是最精准的匹配，针对子类异常捕获时要放在父类的前面

	函数的异常声明：
		返回值类型 函数名(参数列表) throw (类型1，类型2,...)
		注意：如果不写异常声明表示什么类型的异常都可能抛出。
		注意：如果写了异常声明表示只抛出某些类型的异常，一旦超出异常声明的范围，程序会直接结束，无法捕获。
		注意：throw()表示什么类型都不会抛出。


	设计异常类：  demo11.cpp
	
	class Error
	{
		int errno;
		char errmsg[255];
	public:
		Error(int error = -1,const char* msg="未知错误")
		{
			this ->erron =error;
			strcpy(errmsg,msg);
		}
		int getError(void)
		{
			return errno;
		}
		const char* getErrmsg(void)
		{
			return errmsg;
		}
	}
	
	
	
	
	
	
	
	
	https://blog.csdn.net/nikiyoyo/article/details/78893453#commentBox
	
	

https://blog.csdn.net/kingzz11/article/details/7330572#commentBox



https://blog.csdn.net/null1132214759/article/details/72809744

















